#include "Lugar.h"
#include <string>
#include <iostream>

using namespace std;

// CONSTRUCTORES

Lugar::Lugar() {
	this->amigos = vector<Utilizador*>();
}

Lugar::Lugar(const std::string nome) {
	this->amigos = vector<Utilizador*>();
	this->nome = nome;
}

Lugar::~Lugar() {
	amigos.clear();
	ligacoes.clear();
}

// METODOS

string Lugar::getNome() const {
	return nome;
}

int Lugar::getNumeroAmigos() const {
	return amigos.size();
}

void Lugar::adicionarAmigo(Utilizador* amigo) {
	this->amigos.push_back(amigo);
}

void Lugar::removerAmigo(Utilizador* amigo) {
	for (unsigned int i = 0; i < amigos.size(); i++) {
		if (this->amigos[i]->getNickname() == amigo->getNickname()) {
			amigos.erase(amigos.begin() + i);
			cout << "O utilizador " << amigo->getNickname() << " deixou de pertencer ao lugar " << getNome() << "." << endl;
		}
	}
}

void Lugar::adicionarLigacao(Lugar* lugar) {
	this->ligacoes.push_back(lugar);
}

void Lugar::removerLigacao(Lugar* lugar) {
	for (unsigned int i = 0; i < ligacoes.size(); i++) {
		if (this->ligacoes[i]->getNome() == lugar->getNome()) {
			ligacoes.erase(ligacoes.begin() + i);
			cout << "O lugar " << lugar->getNome() << " deixou de ter ligacao para o lugar " << getNome() << "." << endl;
		}
	}
}

void Lugar::imprimir(std::ostream& out) const {
	out << "Lugar: " << getNome();

	Lugar::imprimir_amigos(out);
	Lugar::imprimir_ligacoes(out);

	out << "." << endl;
}

void Lugar::imprimir_amigos(std::ostream& out) const {
	out << ", Amigos: ";

	for (unsigned int i = 0; i < amigos.size(); i++) {
		out << amigos[i]->getNickname();
		if (i < (amigos.size() - 1))
			out << ", ";
	}

	if (amigos.size() == 0) {
		out << "Nao tem";
	}
}

void Lugar::imprimir_ligacoes(std::ostream& out) const {
	out << ", Ligacoes: ";

	for (unsigned int i = 0; i < ligacoes.size(); i++) {
		out << ligacoes[i]->getNome();
		if (i < (ligacoes.size() - 1))
			out << ", ";
	}

	if (ligacoes.size() == 0) {
		out << "Nao tem";
	}
}

const Lugar& Lugar::operator =(const Lugar& lugar) {
	this->nome = lugar.getNome();
	this->amigos.clear();
	for (unsigned int i = 0; i < lugar.amigos.size(); i++) {
		amigos[i] = lugar.amigos[i];
	}
	this->ligacoes.clear();
	for (unsigned int i = 0; i < lugar.ligacoes.size(); i++) {
		ligacoes[i] = lugar.ligacoes[i];
	}
	return *this;
}

bool Lugar::operator ==(const Lugar& lugar) const {
	return this->getNome() == lugar.getNome();
}

bool Lugar::operator >(const Lugar& lugar) const {
	return this->getNome() > lugar.getNome();
}

ostream& operator <<(ostream& out, const Lugar& lugar) {
	lugar.imprimir(out);
	return out;
}
